﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using PomodoroSuite.EntidadesNegocio;
using PomodoroSuite.EntidadesNegocio.Enumeradores;
using PomodoroSuite.FrontEnd.Win.Properties;
using PomodoroSuite.FW.Comun.Apoyo;
using PomodoroSuite.FW.Comun.Caching;
using PomodoroSuite.FW.DAL;
using ComponentFactory.Krypton.Toolkit;

namespace PomodoroSuite.FrontEnd.Win
{
    public partial class frmListaTareas : KryptonForm
    {
        #region " Campos "

        private List<Filtro> filtros = new List<Filtro>();
        private DalGenerico<Tarea> dalTarea = null;

        #endregion

        #region " Eventos "

        public event EventHandler OnRefrescar;

        #endregion

        #region " Constructor "

        public frmListaTareas()
        {
            InitializeComponent();
            dalTarea = FabricaDAL.ObtenerDal<Tarea>();

            List<EntidadGenerica> lista = new List<EntidadGenerica>();
            lista.Add(new EntidadGenerica(Resources.prioridad_Alta, Prioridad.Alta));
            lista.Add(new EntidadGenerica(Resources.prioridad_Normal, Prioridad.Normal));
            lista.Add(new EntidadGenerica(Resources.prioridad_Baja, Prioridad.Baja));

            cmbPrioridad.DataSource = lista;

            lista = new List<EntidadGenerica>();
            lista.Add(new EntidadGenerica(Resources.planificacion_Planeado, Planificacion.Planeado));
            lista.Add(new EntidadGenerica(Resources.planificacion_NoPlaneado, Planificacion.NoPlaneado));

            cmbPlanificacion.DataSource = lista;

            lista = new List<EntidadGenerica>();
            lista.Add(new EntidadGenerica(Resources.estado_Planeado, Estado.Planeado));
            lista.Add(new EntidadGenerica(Resources.estado_EnProgreso, Estado.EnProgreso));
            lista.Add(new EntidadGenerica(Resources.estado_Terminado, Estado.Terminado));
            lista.Add(new EntidadGenerica(Resources.estado_Cancelado, Estado.Cancelado));

            cmbEstado.DataSource = lista;
        }

        #endregion

        #region " Eventos Formulario "

        private void frmListaTareas_Load(object sender, EventArgs e)
        {
            cmbPlanificacion.SelectedIndex = 0;
            cmbEstado.SelectedIndex = 0;
            cmbPrioridad.SelectedIndex = 0;
            /// Se obtienen todas las tareas que no están terminadas
            filtros.Add(new Filtro("IdUsuario", Program.UsuarioActivo.IdUsuario));
            filtros.Add(new Filtro("EstadoTarea", Estado.Terminado));
            filtros[1].OperacionLogica = Operacion.NoIgual;
            gridTareas.DataSource = dalTarea.ObtenerListadoFiltrado(filtros);
            filtros.Clear();
        }

        private void gridTareas_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            switch ((gridTareas.Rows[e.RowIndex].DataBoundItem as Tarea).EstadoTarea)
            {
                case Estado.Planeado:
                    break;
                case Estado.EnProgreso:
                    gridTareas.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
                    break;
                case Estado.Terminado:
                    gridTareas.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.YellowGreen;
                    break;
                case Estado.Cancelado:
                    gridTareas.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Crimson;
                    gridTareas.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.White;
                    break;
            }
        }

        private void btnFiltrar_Click(object sender, EventArgs e)
        {
            if (chkFechaCreacion.Checked)
            {
                filtros.Add(new Filtro("FechaCreacion", Operacion.MayorIgual, dtpFechaCreacion.Value.Date));
                filtros.Add(new Filtro("FechaCreacion", Operacion.Menor, dtpFechaCreacion.Value.AddDays(1).Date));
                filtros[1].NombreVariable = "FechaCreacionFin";
            }
            if (chkFechaInicio.Checked)
            {
                filtros.Add(new Filtro("FechaInicio", Operacion.MayorIgual, dtpFechaInicio.Value.Date));
                filtros.Add(new Filtro("FechaInicio", Operacion.Menor, dtpFechaInicio.Value.AddDays(1).Date));
                filtros[1].NombreVariable = "FechaInicioFin";
            }
            if (chkTag.Checked)
            {
                filtros.Add(new Filtro("Tag", txtTag.Text, TipoValor.Cadena));
                filtros[filtros.Count - 1].OperacionLogica = Operacion.Like;
            }
            if (chkNombre.Checked)
            {
                filtros.Add(new Filtro("Nombre", txtNombre.Text, TipoValor.Cadena));
                filtros[filtros.Count - 1].OperacionLogica = Operacion.Like;
            }
            if (chkPrioridad.Checked)
                filtros.Add(new Filtro("PrioridadTarea", (cmbPrioridad.SelectedItem as EntidadGenerica).Valor));
            if (chkEstado.Checked)
                filtros.Add(new Filtro("EstadoTarea", (cmbEstado.SelectedItem as EntidadGenerica).Valor));
            if (chkPlanificacion.Checked)
                filtros.Add(new Filtro("PlanificacionTarea", (cmbPlanificacion.SelectedItem as EntidadGenerica).Valor));

            gridTareas.DataSource = dalTarea.ObtenerListadoFiltrado(filtros);
            filtros.Clear();
        }

        private void nuevaTareaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmEdicionTarea edicion = new frmEdicionTarea();
            if (edicion.ShowDialog() == DialogResult.OK)
            {
                frmListaTareas_Load(sender, e);
                if (OnRefrescar != null)
                    OnRefrescar(null, e);
            }
        }

        private void editarTareaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (gridTareas.SelectedRows != null && gridTareas.SelectedRows.Count > 0)
            {
                frmEdicionTarea edicion = new frmEdicionTarea(gridTareas.SelectedRows[0].DataBoundItem as Tarea);
                if (edicion.ShowDialog(this) == DialogResult.OK)
                {
                    frmListaTareas_Load(sender, e);
                    if (OnRefrescar != null)
                        OnRefrescar(null, e);
                }
            }
        }

        private void iniciarHoyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (gridTareas.SelectedRows != null && gridTareas.SelectedRows.Count > 0)
            {
                Tarea tarea = gridTareas.SelectedRows[0].DataBoundItem as Tarea;
                if (tarea.EstadoTarea == Estado.Cancelado || tarea.EstadoTarea == Estado.Terminado)
                {
                    MessageBox.Show(Resources.frmListaTareas_TareaTerminada, Resources.comun_Informacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    tarea.FechaInicio = DateTime.Now.Date;
                    dalTarea.Actualizar(tarea);
                    gridTareas.Refresh();
                    if (OnRefrescar != null)
                        OnRefrescar(null, e);
                }
            }
        }

        private void visorPomodorosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (gridTareas.SelectedRows != null && gridTareas.SelectedRows.Count > 0)
            {
                Tarea tarea = gridTareas.SelectedRows[0].DataBoundItem as Tarea;
                if (tarea.IdTareaSet.HasValue)
                {
                    frmVisorPomodoros pomodoros = new frmVisorPomodoros(tarea.IdTareaSet.Value);
                    pomodoros.ShowDialog();
                }
            }
        }

        #endregion

        #region " Métodos "

        public void Refrescar(object sender, EventArgs e)
        {
            frmListaTareas_Load(sender, e);
        }

        #endregion
    }
}
